package ru.inse.core.service;

import java.util.List;

import ru.inse.core.dao.DaoException;
import ru.inse.core.dao.ICriteriaAppender;
import ru.inse.core.dao.IDao;
import ru.inse.core.domain.BaseEntity;
import ru.inse.core.exception.CoreException;


/**
 * Абстрактный класс для менеджеров.
 * Реализует общие для всех методы
 *
 * @param <E> тип сущности
 */
public abstract class AbstractService<E extends BaseEntity>
    implements IService<E>
{
    /**
     * Сохраняет или обновляет объект
     * @param entity
     * @throws Exception
     */
    public void save(E entity) throws CoreException
    {
        getDao().save(entity);
    }

    public void persist(E entity) throws CoreException
    {
        getDao().persist(entity);
    }

    /**
     * Возвращает все сущности
     * @return
     */
    public List<E> getAll()
    {
        return getDao().getAll();
    }

    /**
     * Возвращает объект по id
     *
     * @param id
     * @return
     * @throws DaoException выкидывает исключение если сущность по указанному ID не найдена
     */
    public E getById(Long id)
        throws DaoException
    {
        return getDao().getById(id);
    }

    /**
     * Удаляет сущность из базы по ID
     *
     * @param id
     * @throws DaoException если такой сущности не найдено
     */
    public void remove(Long id)
        throws DaoException
    {
        getDao().remove(id);
    }

    /**
     * Удаляет все сущности из базы
     */
    public void removeAll()
    {
        getDao().removeAll();
    }

    /**
     * @return количество сущностей в БД
     */
    public Long count()
    {
        return getDao().count();
    }

    /**
     * @return количество сущностей в БД
     * @throws DaoException 
     */
    public Long count(ICriteriaAppender criteriaAppender)
    {
        return getDao().count(criteriaAppender);
    }
    
    

    /**
     * Возвращает DAO для сущности, используется для реализации общих методов
     *
     * @return
     */
    abstract protected IDao<E> getDao();
}
